﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;


namespace AudiPyme.UI
{
    public partial class RelacionesGestTipActVuln : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                int IdEmpresa = DatosEmpresa();
                if (IdEmpresa != -1)
                {
                    try
                    {
                        //Muestras las instancias de las relaciones tipo activo - vulnerabilidad de la empresa
                        ModeloContainer agenteBD = new ModeloContainer();
                        int nRelac = InstanciaTiposActivosVulnerabilidadesFactory.NumRelacTipActVuln(IdEmpresa);
                        if (nRelac == 0)
                        {
                            MuestraMensaje("La empresa no tiene ninguna relación insertada en la base de datos");
                            PnlOpciones.Visible = false;
                        }
                        else
                        {

                            //Número de controles seleccionados actualmente
                            int nControlesOn = 0;
                            //Numero de relaciones tipo activo - vulnerabilidad que hay actualmente en la BD
                            int numRelTipActVuln = Matriz_TiposActivosVulnerabilidadesFactory.NumRelacTipActVuln();
                            List<int> Contador = new List<int>(numRelTipActVuln);
                            //Inicializamos la estructura
                            for (int i = 0; i < Contador.Capacity; i++)
                            {
                                Contador.Insert(i, 0);
                            }
                            String OpcionFiltro = RblFiltro.SelectedValue;
                            String TextoBuscar = TxtFiltro.Text;
                            LlenaGridView(OpcionFiltro, TextoBuscar);
                            //Inicializamos la estructura que va a almacenar los estados de las relaciones
                            List<TipActVulnCheck> CheckList = new List<TipActVulnCheck>(numRelTipActVuln);
                            //Guardamos en variables de sesión
                            Session["CheckList"] = CheckList;
                            Session["nControlesOn"] = nControlesOn;
                        }
                    }
                    catch (Exception e1)
                    {
                        e1.ToString();
                        MuestraMensaje("Error al cargar la página");
                    }
                }
            }
        }

        //Método que se ejecuta al evento de cliquear uno de los checkbox de cualquier relación de la tabla
        protected void CheckBox_Changued(Object sender, EventArgs e)
        {
            try
            {
                int IdEmpresa = DatosEmpresa();
                if (IdEmpresa != -1)
                {
                    //Recuperamos las variables de sesión
                    //Recogemos el valor de las relaciones seleccionadas en las otras paginas del GridView
                    //con la variable de sesión nControlesOn
                    int nControlesOn = (int)Session["nControlesOn"];
                    List<TipActVulnCheck> CheckList = (List<TipActVulnCheck>)Session["Checklist"];
                    //Recorremos la página que el gridview muestra
                    foreach (GridViewRow row in GVTipActVuln.Rows)
                    {
                        //Recogemos el control CheckBox de cada fila del gridview
                        CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                        //Recogemos el Id del Tipo de Activo y el Id de la Vulnerabilidad de cada fila
                        int IdTipoActivo;
                        int.TryParse(GVTipActVuln.Rows[row.RowIndex].Cells[0].Text, out IdTipoActivo);
                        int IdVulnerabilidad;
                        int.TryParse(GVTipActVuln.Rows[row.RowIndex].Cells[2].Text, out IdVulnerabilidad);
                        //Si es la primera vez que se elige esa relación, aumentamos el contador
                        //y marcamos que esa relación ya está elegida
                        if (Chk.Checked == true && !EstaRelacion(CheckList, IdTipoActivo, IdVulnerabilidad))
                        {
                            if (nControlesOn == 0)
                            {
                                BtnEliminar.Enabled = true;
                            }
                            CheckList.Add(new TipActVulnCheck(IdEmpresa, IdTipoActivo, IdVulnerabilidad, true));
                            nControlesOn++;
                        }
                        //Sino marcamos que la relación no está elegida y actualizamos estructuras
                        else if (Chk.Checked == false && EstaRelacion(CheckList, IdTipoActivo, IdVulnerabilidad))
                        {
                            //Eliminamos las ocurrencias guardadas anteriormente de la relación
                            for (int i = 0; i < CheckList.Count(); i++)
                            {
                                if (CheckList[i].IdTipoActivo == IdTipoActivo && CheckList[i].IdVulnerabilidad == IdVulnerabilidad)
                                {
                                    CheckList.RemoveAt(i);
                                }
                            }

                            nControlesOn--;
                            if (nControlesOn == 0)
                            {
                                BtnEliminar.Enabled = false;
                            }
                        }
                    }
                    //Si estamos en la opción de elementos Seleccionados, actualizamos el gridview
                    String OpcionFiltro = RblFiltro.SelectedValue;
                    if (OpcionFiltro.Equals("RelacSelec"))
                    {
                        GridViewRelacionesSeleccionadas();
                    }
                    //Actualizamos el número de controles elegidos en el label
                    LblControl.Text = nControlesOn.ToString();
                    //Guardamos en la variable de sesión
                    Session["CheckList"] = CheckList;
                    Session["nControlesOn"] = nControlesOn;
                }
            }
            catch (Exception e1)
            {
                MuestraMensaje("Error al hacer click en el elemento de la tabla");
                e1.ToString();
            }
        }


        protected void GVTipActVuln_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                try
                {
                    //Recogemos el array tipado con el valor de las relaciones que han sido elegidas
                    List<TipActVulnCheck> CheckList = (List<TipActVulnCheck>)Session["Checklist"];
                    //Recorremos el Gridview antes de cambiar de página
                    foreach (GridViewRow row in GVTipActVuln.Rows)
                    {
                        //Recogemos el control CheckBox de cada fila
                        CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                        //Si está seleccionado
                        if (Chk.Checked == true)
                        {
                            //Recogemos el IdTipoActivo y el IdVulnerabilidad de la fila
                            int IdTipoActivo;
                            int.TryParse(GVTipActVuln.Rows[row.RowIndex].Cells[0].Text, out IdTipoActivo);
                            int IdVulnerabilidad;
                            int.TryParse(GVTipActVuln.Rows[row.RowIndex].Cells[2].Text, out IdVulnerabilidad);
                        }
                        //Si no está seleccionado
                        if (Chk.Checked == false)
                        {
                            //Recogemos el IdTipoActivo e IdVulnerabilidad de la fila
                            int IdTipoActivo;
                            int.TryParse(GVTipActVuln.Rows[row.RowIndex].Cells[0].Text, out IdTipoActivo);
                            int IdVulnerabilidad;
                            int.TryParse(GVTipActVuln.Rows[row.RowIndex].Cells[2].Text, out IdVulnerabilidad);
                            //Actualizamos el valor de contador
                            if (EstaRelacion(CheckList, IdTipoActivo, IdVulnerabilidad))
                            {
                                //Creamos el objeto AmenContrCheck con los valores y lo insertamos en la lista
                                int indice = IndiceRelacion(CheckList, IdTipoActivo, IdVulnerabilidad);
                                CheckList.RemoveAt(indice);
                            }
                        }
                    }
                    //Actualizamos la variable de sesión
                    this.GVTipActVuln.PageIndex = e.NewPageIndex;
                    Session["CheckList"] = CheckList;
                    String OpcionFiltro = RblFiltro.SelectedValue;
                    if (OpcionFiltro.Equals("RelacSelec"))
                    {
                        GridViewRelacionesSeleccionadas();
                    }
                    else
                    {
                        String TextoBuscar = TxtFiltro.Text;
                        LlenaGridView(OpcionFiltro, TextoBuscar);
                        ActualizaCheckListTabla();
                    }
                }
                catch (Exception e1)
                {
                    e1.ToString();
                    MuestraMensaje("Error al actualizar la página de la tabla");
                }
            }
        }

        //Devuelve si la relación está seleccionada en el checklist
        private bool EstaRelacion(List<TipActVulnCheck> CheckList, int IdTipoActivo, int IdVulnerabilidad)
        {
            for (int i = 0; i < CheckList.Count(); i++)
            {
                if (CheckList[i].IdTipoActivo == IdTipoActivo && CheckList[i].IdVulnerabilidad == IdVulnerabilidad)
                {
                    return true;
                }
            }
            return false;
        }

        //Indica el índice del checklist donde éstá guardada la relación
        private int IndiceRelacion(List<TipActVulnCheck> CheckList, int IdTipoActivo, int IdVulnerabilidad)
        {
            for (int i = 0; i < CheckList.Count(); i++)
            {
                if (CheckList[i].IdTipoActivo == IdTipoActivo && CheckList[i].IdVulnerabilidad == IdVulnerabilidad)
                {
                    return i;
                }
            }
            return -1;
        }

        private int DatosEmpresa()
        {
            try
            {
                int IdEmpresa = -1;
                String nombreUsuario = (String)Session["nombreUsuario"];
                IdEmpresa = UsuariosFactory.EmpresaUsuario(nombreUsuario);
                if (IdEmpresa == 0)
                {
                    MuestraMensaje("El usuario " + nombreUsuario + " no esta asociado a una empresa");
                    return -1;
                }
                else
                {
                    return IdEmpresa;
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                Session.Abandon();
                MuestraMensajeRedirige("Error al recoger la variable de sesión. La aplicación se cerrará por motivos de seguridad", "InicioSesion");
                return -1;
            }
        }

        protected void BtnEliminar_Click(object sender, EventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                try
                {
                    ModeloContainer agenteBD = new ModeloContainer();
                    List<TipActVulnCheck> CheckList = (List<TipActVulnCheck>)Session["Checklist"];
                    InstanciaTiposActivosVulnerabilidadesNegocio.EliminarInstanciaTipActVuln(CheckList, IdEmpresa);
                    MuestraMensajeRedirige("Instancias Eliminadas Correctamente", "RelacionesPrincipal");
                }
                catch (Exception e1)
                {
                    e1.ToString();
                    MuestraMensaje("Error al eliminar las relaciones");
                }

            }
        }

        protected void RblFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (RblFiltro.SelectedValue.Equals("RelacSelec"))
            {
                TxtFiltro.Visible = false;
                BtnBuscar.Visible = false;
                GridViewRelacionesSeleccionadas();
            }
            else
            {
                TxtFiltro.Visible = true;
                BtnBuscar.Visible = true;
                //Limpiamos el TextBox ya que venimos de otra opción
                TxtFiltro.Text = "";
                String OpcionFiltro = RblFiltro.SelectedValue;
                String TextoBuscar = TxtFiltro.Text;
                LlenaGridView(OpcionFiltro, TextoBuscar);
                ActualizaCheckListTabla();
            }
        }

        protected void BtnBuscar_Click(object sender, EventArgs e)
        {
            String OpcionFiltro = RblFiltro.SelectedValue;
            String TextoBuscar = TxtFiltro.Text;
            LlenaGridView(OpcionFiltro, TextoBuscar);
            ActualizaCheckListTabla();
        }

        private void ActualizaCheckListTabla()
        {
            try
            {
                //Recogemos el array tipado con el valor de las relaciones que han sido elegidas
                List<TipActVulnCheck> CheckList = (List<TipActVulnCheck>)Session["Checklist"];
                //Cargamos el valor de las relaciones que estuvieran seleccionados anteriormente
                for (int i = 0; i < CheckList.Count(); i++)
                {
                    foreach (GridViewRow row in GVTipActVuln.Rows)
                    {
                        int IdTipoActivo;
                        int.TryParse(GVTipActVuln.Rows[row.RowIndex].Cells[0].Text, out IdTipoActivo);
                        int IdVulnerabilidad;
                        int.TryParse(GVTipActVuln.Rows[row.RowIndex].Cells[2].Text, out IdVulnerabilidad);
                        if (IdTipoActivo == CheckList[i].IdTipoActivo && IdVulnerabilidad == CheckList[i].IdVulnerabilidad)
                        {
                            CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                            if (CheckList[i].ValorCheck)
                            {
                                Chk.Checked = true;
                            }
                            else
                            {
                                Chk.Checked = false;
                            }
                        }
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al mostrar los elementos seleccionados");
            }
        }

        private void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        private void GridViewRelacionesSeleccionadas()
        {
            try
            {
                ModeloContainer agenteBD = new ModeloContainer();
                int IdEmpresa = DatosEmpresa();
                //Recogemos el array tipado con el valor de las relaciones tipo activo - vulnerabilidad que han sido elegidas
                List<TipActVulnCheck> CheckList = (List<TipActVulnCheck>)Session["Checklist"];
                List<InstanciaTipActVulnTabla> LRelacionesSelec = new List<InstanciaTipActVulnTabla>();
                //Cargamos el valor de las relaciones que estuvieran seleccionadas anteriormente
                for (int i = 0; i < CheckList.Count(); i++)
                {
                    if (CheckList[i].ValorCheck == true)
                    {
                        InstanciaTipActVulnTabla nuevaFila = new InstanciaTipActVulnTabla();
                        nuevaFila.IdTipoActivo = CheckList[i].IdTipoActivo;
                        nuevaFila.TipoActivo = TiposActivosFactory.RecogeNombreTipoActivo(CheckList[i].IdTipoActivo);
                        nuevaFila.IdVulnerabilidad = CheckList[i].IdVulnerabilidad;
                        nuevaFila.Vulnerabilidad = VulnerabilidadesFactory.NombreVulnerabilidad(CheckList[i].IdVulnerabilidad);
                        LRelacionesSelec.Add(nuevaFila);


                    }
                }
                GVTipActVuln.DataSource = LRelacionesSelec;
                DataBind();
                ActualizaCheckListTabla();
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar la tabla con los elementos seleccionados");
            }
        }

        private void MuestraMensajeRedirige(string Mensaje, string Pagina)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            SB.Append("var vers = navigator.appVersion;if(vers.indexOf('MSIE 7.0') != -1) { window.location='" + Pagina + ".aspx';} else{ window.location='" + Pagina + ".aspx'; }");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        private void LlenaGridView(String OpcionFiltro, String TextoBuscar)
        {
            try
            {
                ModeloContainer agenteBD = new ModeloContainer();
                int IdEmpresa = DatosEmpresa();
                OpcionFiltro = RblFiltro.SelectedValue;
                TextoBuscar = TxtFiltro.Text;
                List<InstanciaTipActVulnTabla> LRelaciones = new List<InstanciaTipActVulnTabla>();
                //Relaciones Tipo Activo-Vulnerabilidad actuales de la empresa
                var relacionesEmp = from i in agenteBD.InstanciaTiposActivosVulnerabilidadesEstablecer
                                    where i.IdEmpresa == IdEmpresa && i.Actual == true
                                    select new { i.IdTipoActivo, i.IdVulnerabilidad };
                //Si no se ha introducido texto de búsqueda, sacamos todas las relaciones disponibles salvo las existentes en la empresa
                if (TextoBuscar.Equals("") || OpcionFiltro.Equals(""))
                {
                    LRelaciones = InstanciaTipActVulnTabla.RecogeInstanciasEmpresa(IdEmpresa);
                    GVTipActVuln.DataSource = LRelaciones;
                    DataBind();
                }
                else
                {
                    switch (OpcionFiltro)
                    {
                        case "TipoActivo":
                            //Relaciones Tipo Activo-Vulnerabilidad por la empresa con el Filtro de TipoActivo
                            LRelaciones = InstanciaTipActVulnTabla.RecogeInstanciasEmpresaPorTipoActivo(IdEmpresa, TextoBuscar);
                            break;
                        case "Vulnerabilidad":
                            //Relaciones Tipo Activo-Vulnerabilidad por la empresa con el Filtro de Vulnerabilidad
                            LRelaciones = InstanciaTipActVulnTabla.RecogeInstanciasEmpresaPorVulnerabilidad(IdEmpresa, TextoBuscar);
                            break;
                        default:
                            MuestraMensaje("No se recogio la opcion de Filtro elegida");
                            break;
                    }
                    if (LRelaciones.Count() == 0)
                    {
                        MuestraMensaje("No se encontraron relaciones con " + OpcionFiltro + " que contuvieran la secuencia " + TextoBuscar);
                    }
                    else
                    {
                        GVTipActVuln.DataSource = LRelaciones;
                        DataBind();
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar los datos en la tabla");
            }
        }

    }

}